package com.y.fund.utils;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import com.y.fund.aacore.able.TreeIface;

public class TreeUtil {


    /** 
     *              将列表数据转换为树状结构, 兼容一截树展示的情况【即传入列表的根节点的fid也不为空】，
     * @param TreeIfaces 传入的树节点列表
     * @return
     */
    @SuppressWarnings("rawtypes")
	public static List<TreeIface> list2Tree(final List<? extends TreeIface> treeIfaces) {
        List<TreeIface> trees = new ArrayList<TreeIface>();
    	if(null==treeIfaces) {
    		return trees;
    	}
    	/**使用排除子节点的方式获取根节点，而不是直接判断fid是否为空，这样可以支持一截树【根节点的fid也不为空】的组成形式 */
        Set<TreeIface> rootSet = new HashSet<TreeIface>();
        for(TreeIface t : treeIfaces) {
        	t.setLevel(1);
        	rootSet.add(t);
        }
        
        for (TreeIface tree : treeIfaces) {
            for (TreeIface it : treeIfaces) {
                if (null!=tree.getId() && tree.getId().equals(it.getFid())) {
                    if (tree.getSub() == null) {
                    	tree.setSub(new LinkedHashSet<TreeIface>());
                    }
                    /**是子节点，则从根节点中移除，先从根列表移除 */
                    rootSet.remove(it);
                    
                    it.setLevel(null==tree.getLevel()?1:(tree.getLevel()+1));
                    tree.getSub().add(it);
                }
            }
        }

        /**加载剩余的不属于子节点树的数据*/
        trees.addAll(rootSet);
        
        return trees;
    }
}
